package com.reflect;

import org.junit.Test;

import java.lang.reflect.Constructor;

/**
 * 获取student类的构造器
 * 首先要先获取类对象
 */

public class TestStudentDemo1 {
    public static void main(String[] args) {

        //使用Junit测试类：这样就不用总运行main方法（主线程）了

        //2.获取对象中全部的构造器，私有的也能拿（getDeclaredConstructors）


        //3.获取某个构造器 ，只能拿public修饰的某个构造器：getConstructor（parametertypes）根据参数类型去匹配

        //获取无参构造器

        //获取有参数构造器


        //4.获取某个构造器，私有的也能拿，也是根据参数类型来拿

    }
    @Test
    public void getConstructors(){
        //获取类对象
        Class c=Student.class;
        //1.获取对象中全部public修饰的构造器
        Constructor[] constructors = c.getConstructors();
        for (Constructor constructor : constructors) {
            //输出构造器的名字和参数个数
            System.out.println(constructor.getName()+"---->"+constructor.getParameterCount());
            //com.reflect.Student---->0
            //com.reflect.Student---->3
        }
    }

    @Test
    //2.获取对象中全部的构造器，私有的也能拿（getDeclaredConstructors）
    public void getDeclareDConstructors(){
        Class c=Student.class;
        Constructor[] declaredConstructors = c.getDeclaredConstructors();
        for (Constructor constructor : declaredConstructors) {
            System.out.println(constructor.getName()+"----->"+constructor.getParameterCount());
        }
    }
    @Test
    //3.获取某个构造器 ，只能拿public修饰的某个构造器：getConstructor（parametertypes）根据参数类型去匹配
    public void getConstrutor() throws Exception {
        Class c=Student.class;
        //获取无参构造器
        Constructor constructor = c.getConstructor();
        System.out.println(constructor.getName()+"----->"+constructor.getParameterCount());

        //获取有参数构造器
        Constructor constructor1 = c.getConstructor(String.class, int.class, double.class);
        System.out.println(constructor1.getName()+"---->"+constructor1.getParameterCount());


    }
    @Test
    //4.获取某个构造器，私有的也能拿，也是根据参数类型来拿
    public void getDeclareConstrutor() throws Exception {
        Class c=Student.class;
        //获取无参构造器
        Constructor constructor = c.getDeclaredConstructor();
        System.out.println(constructor.getName()+"----->"+constructor.getParameterCount());

        //获取有参数构造器
        Constructor constructor1 = c.getDeclaredConstructor(String.class, int.class, double.class);
        System.out.println(constructor1.getName()+"---->"+constructor1.getParameterCount());


    }

}
